package com.example.springframework.beans.factory.support;

import com.example.springframework.beans.BeansException;
import com.example.springframework.beans.factory.config.BeanDefinition;

/**
 * @fileName: {@link AbstractAutowireCapableBeanFactory}
 * @author: yyfl
 * @date: 2023/2/23 14:44
 * @description:
 * @history:
 *
 * 该抽象类继承了 AbstractBeanFactory 类就可以使用父类的 获取Bean的方法
 *   1、由于父类的获取Bean的方法中如果没有获取到Bean实例化对象时，是会自己去实例化的
 *   2、但是呢父类的 AbstractBeanFactory 中的 createBeanDefinition 是一个抽象方法
 *   3、是可以由另外一个继承他的类或者抽象类进行具象实现的。
 *   4、那么子类实现后，子类调用父类的getBean方法时，回去调用子类的 createBeanDefinition 的实现
 *   5、那么这样就可以做到你有你的实现方式我有我的实现方式，但是呢我们都是调用同一个父类的方法来获取Bean实例化对象
 *
 * 1、那么在继承抽象类AbstractBeanFactory类后就可以实现相应的抽象方法了
 * 2、因为自己本身也是一个抽线类所以自己本身会实现自己的抽象方法
 * 3、其他抽象类由继承自身的类进行实现
 * 4、这里就体现了类实现的过程中的各司其职,你只关心属于你的内容,不是你的内容,不要参与.
 *
 */
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory{

    @Override
    public Object createBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeansException {
        Object bean;

        try {

            // 实现bean的实例化操作 若有构造函数的类应该怎么处理？
            bean = beanDefinition.getBeanClass().newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }

        // 此处存bean的实例对象
        addSingletonBean(beanName, bean);
        return bean;
    }
}
